#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#define int long long
#define pii pair<int, int>
using namespace std;

// 已知
int n, m;              // 动物园和喜欢的动物数量
int pay[111];          // 动物园的花费
vector<vector<int>> a; // 动物园有的动物
// 未知
int mn = 1e18; // 最小花费

void input()
{
    cin >> n >> m;
    a.resize(m);
    for (int i = 0; i < n; ++i)
    {
        cin >> pay[i];
    }
    for (int i = 0; i < m; ++i)
    {
        int K;
        cin >> K;
        a[i].resize(K);
        for (int j = 0; j < K; ++j)
        {
            int x;
            cin >> x;
            a[i][j] = x - 1; // 转换为0-based索引
        }
    }
}
bool check(vector<int> x)
{
    for (int j = 0; j < m; ++j) // 检查每个动物
    {
        int sum = 0; // 当前动物看过几次
        for (int z : a[j]) sum += x[z]; // a[j]里的都是有j号动物的，这个动物园如果去过计数器就增加
        if (sum < 2) return false; // j号动物没去够两次这种方案就不行
    }
    return true; // 方案可行
}
void solve()
{
    // 枚举每种动物所有可能的组合，每种动物要看两遍
    int mxn = pow(3, n);
    for (int i = 0; i < mxn; ++i)
    {
        vector<int> x(n); // 存放当前组合
        int tmp = i;
        for (int j = 0; j < n; ++j)
        {
            x[j] = tmp % 3;
            tmp /= 3;
        }
        if (check(x))
        {
            int cost = 0;
            for (int j = 0; j < n; ++j)
            {
                cost += x[j] * pay[j];
            }
            mn=min(mn,cost);
        }
    }
}

signed main()
{
    input();
    solve();
    cout << mn;
    return 0;
}